/*使实用工具类的实现：
- 获取系统时间
- 判断⽂件是否存在
- 获取⽂件的所在⽬录路径
- 创建⽬录（如果指定存放日志的文件目录不存在的话，那么我们就得进行目录的创建了）
*/
#ifndef __UTIL_HPP__
#define __UTIL_HPP__
#include <iostream>
#include <ctime>
#include <sys/stat.h>
namespace kaizi
{
    namespace util
    {
        class Date
        {
        public:
            static size_t now()
            {
                return (size_t)time(nullptr);
            }
        }; 
        class File
        {
        public:
            static bool exists(const std::string &pathname) // 检查路径中的文件是否存在
            {
                struct stat st;
                if (stat(pathname.c_str(), &st) < 0)
                {
                    return false;
                }
                return true;
                // return (access(pathname.c_str(), F_OK)==0);
            }
            static std::string path(const std::string &pathname) // 获取路径名
            {
                //  ./abc/def.txt  这里我们只需要从一开始获取到def前面的/那里就行了,我们直接查找最后一个/
                size_t pos = pathname.find_last_of("/\\"); //  '/\\' 是为了适配不同操作系统的路径分隔符
                if (pos == std::string::npos)
                    return ".";                     // 说明没找到,我们直接返回一个点
                return pathname.substr(0, pos + 1); // 加上1是为了包含'/'在内的整个路径名，利用substr进行长度的截取操作
            }
            static void createDirectory(const std::string &pathname) // 递归创建目录
            {
                //  ./abc/bcd/a.txt  目录得一层一层的进行创建，要创建a.txt的话就得存在bcd，要创建bcd的话就得存在abc了

                // 找到一个创建一个
                size_t pos = 0, idx = 0;
                while (idx < pathname.size())
                {
                    pos = pathname.find_first_of("/\\", idx); // 从idx开始查找第一个路径分隔符
                    if (pos == std::string::npos)             // 说明没找到,说名我们只存在a.txt，那么我们直接进行创建目录操作
                    {
                        mkdir(pathname.c_str(), 0777); // 0777是为了让所有用户都有权限访问该目录
                    }
                    //存在路径
                    std::string parent_dir = pathname.substr(0, pos  + 1); // 获取父目录名,从0开始到pos-idx+1结束,包含了'/'的路径名
                    if (exists(parent_dir) == true)//存在的话，我们就让idx遍历到这个路径的末尾，继续查找下一个路径分隔符
                    {
                        idx=pos+1; // 继续查找下一个路径分隔符
                        continue; // 如果父目录存在，那么我们就不用再创建了
                    }
                    //不存在的话就进行创建
                    mkdir(parent_dir.c_str(), 0777);
                    idx=pos+1;//继续往后面走
                }
            }
        };
    }
}
#endif 